#pragma once
#include <boost/beast/http.hpp>
#include <boost/beast.hpp>
#include <boost/asio.hpp>
#include <memory>
#include "LogicSystem.h"
#include <unordered_map>
#include "const.h"

/**
 * 管理与客户端的连接，负责与前端的交互，包括消息传递(底层)、消息解析(底层)，属于view层
 * 
 * 
 * 
 * view层：前端交互层，提供消息传递，消息解析等功能，实现协议解析等等，形成任务队列，GRPC
 * controller层：具体每一个业务的处理层，通过前端传过来的参数，实现参数的具体业务调用，之后调用view层提供的各种各样的接口，或者DAO层提供的各种各样的接口，与客户端或者
 * 服务端通信
 * Model层：负责与数据库进行通信
 * 一个HttpConnectio只负责一个connection，当结束之后，就释放掉
 */
class HttpConnection :public std::enable_shared_from_this<HttpConnection>
{
public:
	friend class LogicSystem;
	HttpConnection(tcp::socket socket);
	
	
	void Start();																		//开始监听客户端的读写事件入口

	void HandleReq();																	//解析消息，发送到Logic系统进行业务处理，
																						//之前是形成消息节点：包括参数，业务，logic那里会注册响应的函数对象处理，不用像现在这样在里面处理好
																						//业务的划分也许是比较难的一部分

	void CheckDeadline();																//检查时间，http的超时检查事件

	void WriteResponse();																//最终发送回应消息

	void PreParseGetParam();															//获取参数

private:
	tcp::socket _socket;																//用于保持与客户端的通信,由服务端acceptor传入过来
	

	beast::flat_buffer _buffer{ 8192 };													//用于缓存来自网路 端口的信息


	http::request<http::dynamic_body> _request;											//客户端请求，用于解析	


	http::response<http::dynamic_body> _response;										//发送给客户端回应

	net::steady_timer deadline_{ _socket.get_executor(),std::chrono::seconds(60) };		//计时器，判断是否超时

	std::string _get_url;																//URL
	std::unordered_map<std::string, std::string> _get_params;							//参数

private:


	unsigned char ToHex(unsigned char x);

	unsigned char FromHex(unsigned char x);

	std::string UrlEncode(const std::string& str);

	std::string UrlDecode(const std::string& str);

};

